#include <iostream>
#include <signal.h>
#include <cstring>
#include <ctime>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

// void handler(int signo)
// {
//   pid_t rid;
//   while (rid = waitpid(-1, nullptr, WNOHANG) > 0)
//   {
//     cout << "success" << endl;
//     cout << "process pid is " << getpid() << "catch a signal: " << signo << endl;
//   }
// }

int main()
{
  // srand(time(nullptr));
  signal(17, SIG_IGN);

  for (int i = 1; i <= 10; i++)
  {
    pid_t id = fork();
    if (id == 0)
    {
      // child
      while (true)
      {
        cout << "i am child, pid: " << getpid() << "ppid: " << getppid() << endl;
        sleep(5);
        break;
      }
      exit(0);
    }
    sleep(1);
  }

  // father
  // sleep(5);
  // pid_t rid = waitpid(id, nullptr, 0);
  // if (rid > 0)
  //   cout << "success" << endl;
  while (true)
  {
    cout << "i am father, pid: " << getpid() << endl;
    sleep(1);
  }
  return 0;
}

// volatile int flag = 0;

// void handler(int signo)
// {
//   cout << "catch a signal: " << signo << endl;
//   flag = 1;
// }

// int main()
// {
//   signal(2, handler);
//   while (!flag)
//     ;
//   cout << "process quit normal" << endl;
//   return 0;
// }

// void PrintPending()
// {
//   sigset_t pending;
//   sigemptyset(&pending);

//   sigpending(&pending);
//   for (int signo = 31; signo >= 1; signo--)
//   {
//     if (sigismember(&pending, signo))
//       cout << '1';
//     else
//       cout << '0';
//   }
//   cout << endl;
// }

// void handler(int signo)
// {
//   cout << "catch a signal: " << signo << endl;
//   while (true)
//   {
//     PrintPending();
//     sleep(1);
//   }
// }

// int main()
// {
//   struct sigaction act, oact;
//   memset(&act, 0, sizeof(act));
//   memset(&oact, 0, sizeof(oact));

//   act.sa_handler = handler;

//   sigemptyset(&act.sa_mask);
//   sigaddset(&act.sa_mask, 1);
//   sigaddset(&act.sa_mask, 3);
//   sigaddset(&act.sa_mask, 4);

//   sigaction(2, &act, &oact);

//   while (true)
//   {
//     cout << "i am a process, pid: " << getpid() << endl;
//     sleep(1);
//   }

//   return 0;
// }